home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 March / Macworld (1998-03) (Disk 1).dmg / Shareware World / Info / For Developers / GhostScript 5.10 / MacGS-510 / files / gs_l2img.ps < prev    next >
Text File  |  1996-04-26  |  6KB  |  187 lines

  1. %    Copyright (C) 1995, 1996 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % Emulate the Level 2 dictionary-based image operator in Level 1,
  16. % except for Interpolate (ignored) and MultipleDataSources = true;
  17. % also, we require that the data source be either a procedure of a
  18. % particular form or a stream, not a string or a general procedure.
  19.  
  20. % pdf2ps copies the portion of this file from %BEGIN to %END if Level 1
  21. % compatible output is requested.
  22.  
  23. /currentglobal where
  24.  { pop currentglobal { setglobal } true setglobal }
  25.  { { } }
  26. ifelse
  27.  
  28. /packedarray where
  29.  { pop }
  30.  { /packedarray { array astore readonly } bind def }
  31. ifelse
  32.  
  33. %BEGIN
  34.  
  35. 11 dict /.csncompdict 1 index def begin
  36.   /DeviceGray { 1 /setgray load } bind def
  37.   /DeviceRGB { 3 /setrgbcolor load } bind def
  38.   /DeviceCMYK { 4 /setcmykcolor load } bind def
  39.   /Indexed
  40.    { dup 1 index 1 get //.csncompdict exch get exec
  41.         % Stack: [/Indexed base hival map] ncomp basesetcolor
  42.      3 -1 roll 3 get mark 3 1 roll
  43.         % Stack: ncomp -mark- basesetcolor map
  44.      dup type /stringtype eq
  45.       {  { -
  46.         { exch round cvi get 255 div
  47.         }
  48.        -
  49.         { exch round cvi 3 mul 2 copy 2 copy get 255 div
  50.           3 1 roll 1 add get 255 div
  51.           4 2 roll 2 add get 255 div
  52.         }
  53.         { exch round cvi 4 mul 2 copy 2 copy 2 copy get 255 div
  54.           3 1 roll 1 add get 255 div
  55.           4 2 roll 2 add get 255 div
  56.           5 3 roll 3 add get 255 div
  57.         }
  58.      }
  59.     4 index get aload pop counttomark -1 roll
  60.       }
  61.       { /exec load 3 -1 roll
  62.         % Stack: -mark- mapproc --exec-- basesetcolor
  63.       }
  64.      ifelse .packtomark cvx
  65.      exch pop 1 exch
  66.    } bind def
  67.   /Separation
  68.    { dup 2 index //.csncompdict exch get exec
  69.         % Stack: [/Separation name alt xform] ncomp altsetcolor
  70.      3 -1 roll 3 get /exec load 3 -1 roll 3 array astore readonly cvx
  71.      exch pop 1 exch
  72.    } bind def
  73.     % Substitute device spaces for CIE spaces.
  74.   /CIEBasedA /DeviceGray load def
  75.   /CIEBasedABC /DeviceRGB load def
  76.   /CIEBasedDEF /DeviceRGB load def
  77.   /CIEBasedDEFG /DeviceCMYK load def
  78. end
  79.  
  80. /.packtomark { counttomark packedarray exch pop } bind def
  81.  
  82. /.csinextbits        % - .csinextbits <bits>
  83.             % Uses b, nnb, i, row, mask, BitsPerComponent;
  84.             % sets b, nnb, i.
  85.  { /nnb nnb BitsPerComponent add
  86.     { dup 0 le { exit } if
  87.       /b b 8 bitshift row i get add def
  88.       /i i 1 add def  8 sub
  89.     }
  90.    loop def
  91.    b nnb bitshift mask and
  92.  } bind def
  93.  
  94. % Note that the ColorSpace key must be present in the image dictionary.
  95. /.colorspaceimage        % <imagedict> .colorspaceimage -
  96.  { save exch
  97.    dup length 15 add dict begin { cvlit def } forall
  98.    ColorSpace dup dup type /nametype ne { 0 get } if
  99.    .csncompdict exch get exec
  100.      /setpixelcolor exch def  /ncomp exch def  pop
  101.    /row ncomp BitsPerComponent mul Width mul 7 add 8 idiv string def
  102.       /mask 1 BitsPerComponent bitshift 1 sub def
  103.       /nextbits BitsPerComponent 8 eq
  104.        { { row i get /i i 1 add def } }
  105.        { /.csinextbits load }
  106.       ifelse def
  107.       /nextpixel mark 0 2 ncomp 1 sub 2 mul
  108.        { /nextbits cvx exch
  109.      Decode exch 2 getinterval
  110.      dup aload pop exch sub
  111.      dup mask eq { pop } { mask div /mul load 3 -1 roll } ifelse
  112.      0 get dup 0 eq { pop } { /sub load 3 -1 roll } ifelse
  113.        }
  114.       for
  115.       /setpixelcolor load dup type /operatortype ne { /exec load } if
  116.       .packtomark cvx def
  117.       /readrow
  118.         /DataSource load dup type
  119.         dup /arraytype eq exch /packedarraytype eq or
  120.     {    % Must be { <file> <string> ... }
  121.       aload length 1 add array /pop load exch astore
  122.       dup 1 row put cvx
  123.     }
  124.     { pop
  125.         % Adobe requires readstring to signal an error if given
  126.         % an empty string.  Work around this nonsense here.
  127.           row length 0 eq
  128.        { { } }
  129.        { { DataSource row readstring pop pop } }
  130.       ifelse
  131.     }
  132.       ifelse def
  133.       ImageMatrix matrix invertmatrix concat
  134.       /imat matrix def
  135.       0 1 Height 1 sub
  136.        { imat 5 3 -1 roll neg put
  137. %(.) print flush
  138.      readrow
  139.      /b 0 def  /nnb 0 def  /i 0 def
  140.      0 1 Width 1 sub
  141.       { imat 4 3 -1 roll neg put nextpixel
  142.         1 1 true imat {<80>} imagemask
  143.       }
  144.      for
  145.        }
  146.       for
  147.    end restore
  148.  } bind def
  149.  
  150. %END
  151. exec
  152. currentfile closefile
  153.  
  154. % Patch for testing.
  155. /.cincompdict 3 dict begin
  156.   1 { {0 1} {/DeviceGray} } def
  157.   3 { {0 1 0 1 0 1} {/DeviceRGB} } def
  158.   4 { {0 1 0 1 0 1 0 1} {/DeviceCMYK} } def
  159. currentdict end def
  160. /.imagekeys [
  161.   /Decode /DataSource /ImageMatrix /BitsPerComponent /Height /Width
  162. ] def
  163. /colorimage        % <width> <height> <bits/comp> <matrix>
  164.             %   <datasrc> false <ncomp> colorimage -
  165.  { 1 index { /colorimage load /rangecheck signalerror } if exch pop
  166.    //.cincompdict exch get exec
  167.    7 dict begin /ColorSpace exch cvlit def
  168.    .imagekeys { exch cvlit def } forall
  169.    currentdict end .colorspaceimage
  170.  } bind odef
  171. /image
  172.  { dup type /dicttype ne
  173.     { 7 dict begin /ColorSpace /DeviceGray def [0 1] 
  174.       .imagekeys { exch cvlit def } forall
  175.       currentdict end
  176.     }
  177.     { dup length 1 add dict .copydict dup /ColorSpace currentcolorspace put
  178.     }
  179.    ifelse
  180.    .colorspaceimage
  181.  } bind odef
  182.  
  183. exec
  184.